Isotope Dendrochronology
COURSE: DISC, LTRR, UNIVERSITY OF ARIZONA. INSTRUCTORS: P. SZEJNER & S. BELMECHERI
Instructions :
The following code and comments should further your experience of using a mechanistic model to understand the isotopic fractionation mechanisms underlying Oxygen isotope (d18O) in tree ring cellulose. This exercise will focus on the main determinants (variables and parameters) of cellulose d18O including: (1) source water isotope ratio, (2) leaf water isotopic enrichment, and (3) biochemical fractionation at the site of sucrose production and cellulose synthesis.
The exercise and the mechanistic model correspond to the process based models termed “Craig-Gordon” model [1], and the “Roden” model [2].
[1] Craig H, Gordon L (1965) Deuterium and oxygen 18 variations in the ocean and the marine atmosphere. In: Tongiorgi E (ed) Stable Isotopes in Oceanographic Studies and Paleotemperatures. Consiglio Nazionale delle ricerche Laboratorio di Geologia Nucleare. Pisa, Spoleto, Italy, pp 9–130).
[2] Roden J, Lin G, Ehleringer JR (2000) A mechanistic model for interpretation of hydrogen and oxygen isotope ratios in tree-ring cellulose. Geochim Cosmochim Acta 64:21–35. https://doi.org/10.1016/S0016-7037(99)00195-7
The stable Oxygen isotope composition of cellulose (δ18Ocell) is determined by three factors/processes:
1. The isotopic content of the source water.
2. The leaf evaporative enrichment effect.
3. The proportion of phloem sugars that exchange with source water during cellulose formation.
The signal of these three processes is integrated into the cambium during xylogenesis. The goal of this exercise is to: (1) implement a mechanistic model to account for all these factors processes and their associated fractionations, (2) to use this mechanistic model to interpret variations of cellulose d18O.
You will simulate three different isotopic ratios in tree ring cellulose for different environmental conditions. These environmental condition reflect the growing season variability of relative humidity and precipitation experienced by trees growing in the US Southwest (See Figure 1). The growing season in this region is characterized by a bimodal distribution of precipitation (Winter-snowpack and Summer-Monsoon). The relative humidity varies from dry spring to humid summer. The two periods are separated by a hyper arid period with low precipitation and extremely low relative humidity. Accordingly, the variables in the model will vary as follows:
- The relative humidity from 50% (spring) to 30% (pre-summer drought) to 60% (monsoon).
- The mean air temperature will vary from 25, to 33, to 27 Celsius.
- The source water will remain constant at -8 permill.
At the end of the exercise, you will compare the simulated 18O cellulose for the 3 seasonal variations of RH (and temperature) with measurements of cellulose d18O in tree rings from a site located in the US Southwest.
PART 1: Source Water
The d18O of source water noted as Source_18O is the isotopic ratio of the water transported through the xylem up to the leaves. This water is derived from direct precipitation and soil water taken up by the roots. This process does not alter the original d18O. Thus, source water is the starting point of d18O that will be modified by the isotopic effects (fractionations) during all the steps leading to its fixation in tree ring cellulose. Having a robust estimation or measurement of source water d18O is therefore paramount.
Here, the source water is set up at a fixed value:
Source_18O <- -8 # This is the isotopic value of the source water and will remain constant at -8 permill during this exercise
Then, it is converted to an isotopic ratio with regard to the standard VSMOW:
rsmow <- 0.0020052 # Oxygen Isotope ratio of the STANDARD VSMOW
Rsource= rsmow*(1+Source_18O/1000)
PART 2: leaf water isotopic enrichment
During plant transpiration, the heavier H218O evaporates and diffuses more slowly through the stomata than does H216O, leaving leaf water enriched in 18O. At steady state and considering the leaf as a single and isotopically well-mixed water pool, the leaf water isotopic enrichment can be estimated using the Craig Gordon model as follows:
- De is the isotopic enrichment of evaporative site water (leaf) above the source.
- Epsilon_plus is the equilibrium fractionation between liquid water and vapor.
- Epsilon_k is the kinectic fractionation for combined diffusion through stomata and the boundary layer.
- Dv is the isotopic enrichment of atmospheric vapor compared to source water.
- wa/wi is the ratio of the water vapor mole fraction in the air relative to that in the intercellular air spaces. This is also relative humidity assuming leaf and air temperature are equal.
Constants
These constants will be used to estimate/calculate the various model parameters, specifically the water vapor mole fraction in the air and in the intercellular air spaces.
br <-1 # boundary layer conductance. (mol m-2 s-1), considered reasonable value between 0.02 to 3 in Roden paper boundary layer resistance.
ak <- 1.0285 # alpha_kappa, Kinetic Fractionation
akb <- 1.0189 # alpha_kappa_beta, Kinetic Fractionation boundary layer
Stomatal_conductance <- 0.5 # stomatal conductance to water vapor
press_bar <- 77 # barometric pressure (mmbar)
Model Parameters/Variables
Water Vapor (Dv)
The isotopic value of the water vapor is estimated based on source water d18O and leaf temperature, assuming equilibrium between atmospheric vapor and source water. Water vapor can be estimates as follows:
water_vapor = Source water + the equilibrium fractionation between liquid water and vapor.
The equilibrium fractionation varies as a function of temperature.
# the temperature in the equation below refers to the leaf temperature in degrees Celsius and is converted to Kelvin (273.15)
water_vapor <-Source_18O +(-1*(1.137*(1000000/((temperature+273.15)^2))-0.4156*((1000/(temperature+273.15))-2.0667)))
Then, it is converted to an isotopic ratio with regard to the standard VSMOW:
Rwater_vapor= rsmow*(1+water_vapor/1000)
#note! I need help on figuring out this! What is needed?
Alpha *
The equilibrium fractionation at leaf temperature is temperature dependent (see Majoube, 1971, J. Chim. Phys. 58:1423-1436)
alpha_star =exp((1.137*1000/(273.15+temperature)^2)-(0.4156/(273.15+temperature))-0.0020667)
Water vapor mole fraction in the intercellular air spaces
Here we assume that the vapor is saturated inside the leaf. We apply this formula to calculate the vapor pressure when saturated (Rh=100%) at the temperature we best estimate the plant is and call it "ei".
ei <- (101325*exp((((-0.1299*(1-(373.16/(273.15 + temperature)))-0.6445)*(1-(373.16/(273.15 + temperature)))-1.976)*(1-(373.16/(273.15 + temperature)))+13.3185)*(1-(373.16/(273.15 + temperature)))))/1000
Then leaf water vapor is converted to mole fraction as follows:
wi=ei/press_bar
Water vapor mole fraction in the air
ea <- (Relative_humidity/100)*ei
Then water vapor in the air is converted to mole fraction as follows:
wa= ea/press_bar
Total Conductance
g = 1/(1/Stomatal_conductance + 1/br) # or 1/(rs+rb) in mol
Leaf transpiration
Transpiration will depend on water vapor mole fraction in the air, in the leaf and on total conductance as follows:
E <- (wi-wa)*g #(mol m-2 s-1) # barbour 2004
Leaf surface water vapor
ws <- ((Stomatal_conductance*wi)-E*(1-wi/2))/(Stomatal_conductance - E/2) #mole fraction Roden (2000), Ball (1987).
Vapor pressure at leaf surface
esl <- ws*press_bar #(kPa) higher pressure than the atmosphere
Estimating Leaf water isotopic enrichment
Lets recall the estimated variables necessary to calculate leaf water
Rsource Source water
Rwater_vapor isotopic value of the water vapor
ei Water vapor pressure inside the leaf
ea Water vapor pressure of the air
esl Water vapor pressure at leaf surface
The values can be rounded as follows:
round (Rsource, digits = 4)
round(Rwater_vapor, digits = 4)
round(esl, digits = 2)
round(ea, digits=2)
round(ei, digits=2)
The leaf water enrichment can be estimated as follows:
Rleaf <- alpha_star*((ak*Rsource *
((ei-esl)/ei))+
(akb*Rsource *(esl-ea)/ei)+
(Rwater_vapor*ea/ei))
The leaf water enrichment is estimated in terms of isotopic ratio (R). It should be converted to permill values as follows:
rsmow <- 0.0020052
leaf_water_18O <- ((Rleaf/rsmow)-1)*1000
round(leaf_water_18O, digits = 2)
PART 3: isotopic signal in the Cellulose
Isotopic fractionation during sugar synthesis and mixing during cellulose synthesis.
Now, after we know the water where the sugars are made and transported in the phloem, we can use the leaf water and the Source_18O to estimate the result on the cellulose, take into consideration that during cellulose synthesis, the source water will have some influence on the result, and we usually use a 42 percent exchange.
# Now after we know the water where the sugars are made and trasported in the floem we can use the leaf water and the Source_18O to estimate the end result on the cellulose, take in consideration that during cellulose sinthesisi the source water will have some influence on the end result. and we usualy use a 42 percent exchange
# and some constants
epsilon_s <- 27 #Autotrophic fractionation Sucrose
epsilon_c <- 27 # Autotrophic fractionation Cellulose ## 0.0084*Tmin.ts^2-0.51*Tmin.ts+ 33.172
F_0 <- 0.42 # proportion of source water used during cellulose sinthesys
cellulose_d18O= F_0*(Source_18O + epsilon_c) + (1 - F_0) * (leaf_water_18O+ epsilon_s)
PART 4: Comparison between modeled data and observations
your estimations for the callulose oxygen Isotopes are:
round(cellulose_d18O, digits = 2)
your estimations for the leaf water oxygen Isotopes are:
round(leaf_water_18O, digits = 2)
Comparison between modeled data and observations,
Now with these values that you comared write down your observations differences and similarities between the modeled data in this excersise and the measurements shown in the figure 2 above.
How do you think this tool is useful?
What are the constrains or difficulties on implementing this model for reliable analysis?
VPD in (kPa)
vpd =ei-ea_v round(vpd, digits=4 )
LS0tCnRpdGxlOiAiTWVjaGFuaXN0aWMgbW9kZWwgb2YgdGhlIE94eWdlbiBpc290b3BlIGluIHRyZWUgcmluZyBjZWxsdWxvc2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyMjIyMgIElzb3RvcGUgRGVuZHJvY2hyb25vbG9neQojIyMjIyAgQ09VUlNFOiBESVNDLCBMVFJSLCBVTklWRVJTSVRZIE9GIEFSSVpPTkEuIElOU1RSVUNUT1JTOiBQLiBTWkVKTkVSICYgUy4gQkVMTUVDSEVSSQoKIyMjIEluc3RydWN0aW9ucyA6CgpUaGUgZm9sbG93aW5nIGNvZGUgYW5kIGNvbW1lbnRzIHNob3VsZCBmdXJ0aGVyIHlvdXIgZXhwZXJpZW5jZSBvZiB1c2luZyBhIG1lY2hhbmlzdGljIG1vZGVsIHRvIHVuZGVyc3RhbmQgdGhlIGlzb3RvcGljIGZyYWN0aW9uYXRpb24gbWVjaGFuaXNtcyB1bmRlcmx5aW5nIE94eWdlbiBpc290b3BlIChkMThPKSBpbiB0cmVlIHJpbmcgY2VsbHVsb3NlLiBUaGlzIGV4ZXJjaXNlIHdpbGwgZm9jdXMgb24gdGhlIG1haW4gZGV0ZXJtaW5hbnRzICh2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMpIG9mIGNlbGx1bG9zZSBkMThPIGluY2x1ZGluZzogKDEpIHNvdXJjZSB3YXRlciBpc290b3BlIHJhdGlvLCAoMikgbGVhZiB3YXRlciBpc290b3BpYyBlbnJpY2htZW50LCBhbmQgKDMpIGJpb2NoZW1pY2FsIGZyYWN0aW9uYXRpb24gYXQgdGhlIHNpdGUgb2Ygc3Vjcm9zZSBwcm9kdWN0aW9uIGFuZCBjZWxsdWxvc2Ugc3ludGhlc2lzLgoKVGhlIGV4ZXJjaXNlIGFuZCB0aGUgbWVjaGFuaXN0aWMgbW9kZWwgY29ycmVzcG9uZCB0byB0aGUgcHJvY2VzcyBiYXNlZCBtb2RlbHMgdGVybWVkICJDcmFpZy1Hb3Jkb24iIG1vZGVsIFsxXSwgYW5kIHRoZSAiUm9kZW4iIG1vZGVsIFsyXS4KCgpbMV0gQ3JhaWcgSCwgR29yZG9uIEwgKDE5NjUpIERldXRlcml1bSBhbmQgb3h5Z2VuIDE4IHZhcmlhdGlvbnMgaW4gdGhlIG9jZWFuIGFuZCB0aGUgbWFyaW5lIGF0bW9zcGhlcmUuIEluOiBUb25naW9yZ2kgRSAoZWQpIFN0YWJsZSBJc290b3BlcyBpbiBPY2Vhbm9ncmFwaGljIFN0dWRpZXMgYW5kIFBhbGVvdGVtcGVyYXR1cmVzLiBDb25zaWdsaW8gTmF6aW9uYWxlIGRlbGxlIHJpY2VyY2hlIExhYm9yYXRvcmlvIGRpIEdlb2xvZ2lhIE51Y2xlYXJlLiBQaXNhLCBTcG9sZXRvLCBJdGFseSwgcHAgOeKAkzEzMCkuCgoKWzJdIFJvZGVuIEosIExpbiBHLCBFaGxlcmluZ2VyIEpSICgyMDAwKSBBIG1lY2hhbmlzdGljIG1vZGVsIGZvciBpbnRlcnByZXRhdGlvbiBvZiBoeWRyb2dlbiBhbmQgb3h5Z2VuIGlzb3RvcGUgcmF0aW9zIGluIHRyZWUtcmluZyBjZWxsdWxvc2UuIEdlb2NoaW0gQ29zbW9jaGltIEFjdGEgNjQ6MjHigJMzNS4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvUzAwMTYtNzAzNyg5OSkwMDE5NS03CgoKVGhlIHN0YWJsZSBPeHlnZW4gaXNvdG9wZSBjb21wb3NpdGlvbiBvZiBjZWxsdWxvc2UgKM60MThPY2VsbCkgaXMgZGV0ZXJtaW5lZCBieSB0aHJlZSBmYWN0b3JzL3Byb2Nlc3NlczogIAoxLiBUaGUgaXNvdG9waWMgY29udGVudCBvZiB0aGUgc291cmNlIHdhdGVyLiAgCjIuIFRoZSBsZWFmIGV2YXBvcmF0aXZlIGVucmljaG1lbnQgZWZmZWN0LiAgIAozLiBUaGUgcHJvcG9ydGlvbiBvZiBwaGxvZW0gc3VnYXJzIHRoYXQgZXhjaGFuZ2Ugd2l0aCBzb3VyY2Ugd2F0ZXIgZHVyaW5nIGNlbGx1bG9zZSBmb3JtYXRpb24uICAgCgpUaGUgc2lnbmFsIG9mIHRoZXNlIHRocmVlIHByb2Nlc3NlcyBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGNhbWJpdW0gZHVyaW5nIHh5bG9nZW5lc2lzLiBUaGUgZ29hbCBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvOiAoMSkgaW1wbGVtZW50IGEgbWVjaGFuaXN0aWMgbW9kZWwgdG8gYWNjb3VudCBmb3IgYWxsIHRoZXNlIGZhY3RvcnMgcHJvY2Vzc2VzIGFuZCB0aGVpciBhc3NvY2lhdGVkIGZyYWN0aW9uYXRpb25zLCAoMikgdG8gdXNlIHRoaXMgbWVjaGFuaXN0aWMgbW9kZWwgdG8gaW50ZXJwcmV0IHZhcmlhdGlvbnMgb2YgY2VsbHVsb3NlIGQxOE8uIAoKWW91IHdpbGwgc2ltdWxhdGUgdGhyZWUgZGlmZmVyZW50IGlzb3RvcGljIHJhdGlvcyBpbiB0cmVlIHJpbmcgY2VsbHVsb3NlIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRhbCBjb25kaXRpb25zLiBUaGVzZSBlbnZpcm9ubWVudGFsIGNvbmRpdGlvbiByZWZsZWN0IHRoZSBncm93aW5nIHNlYXNvbiB2YXJpYWJpbGl0eSBvZiByZWxhdGl2ZSBodW1pZGl0eSBhbmQgcHJlY2lwaXRhdGlvbiBleHBlcmllbmNlZCBieSB0cmVlcyBncm93aW5nIGluIHRoZSBVUyBTb3V0aHdlc3QgKFNlZSBGaWd1cmUgMSkuIFRoZSBncm93aW5nIHNlYXNvbiBpbiB0aGlzIHJlZ2lvbiBpcyBjaGFyYWN0ZXJpemVkIGJ5IGEgYmltb2RhbCBkaXN0cmlidXRpb24gb2YgcHJlY2lwaXRhdGlvbiAoV2ludGVyLXNub3dwYWNrIGFuZCBTdW1tZXItTW9uc29vbikuIFRoZSByZWxhdGl2ZSBodW1pZGl0eSB2YXJpZXMgZnJvbSBkcnkgc3ByaW5nIHRvIGh1bWlkIHN1bW1lci4gVGhlIHR3byBwZXJpb2RzIGFyZSBzZXBhcmF0ZWQgYnkgYSBoeXBlciBhcmlkIHBlcmlvZCB3aXRoIGxvdyBwcmVjaXBpdGF0aW9uIGFuZCBleHRyZW1lbHkgbG93IHJlbGF0aXZlIGh1bWlkaXR5LiBBY2NvcmRpbmdseSwgdGhlIHZhcmlhYmxlcyBpbiB0aGUgbW9kZWwgd2lsbCB2YXJ5IGFzIGZvbGxvd3M6ICAKCiogVGhlIHJlbGF0aXZlIGh1bWlkaXR5IGZyb20gNTAlIChzcHJpbmcpIHRvIDMwJSAocHJlLXN1bW1lciBkcm91Z2h0KSB0byA2MCUgKG1vbnNvb24pLiAgCiogVGhlIG1lYW4gYWlyIHRlbXBlcmF0dXJlIHdpbGwgdmFyeSBmcm9tIDI1LCB0byAzMywgdG8gMjcgQ2Vsc2l1cy4gIAoqIFRoZSBzb3VyY2Ugd2F0ZXIgd2lsbCByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsbC4gICAgIAoKQXQgdGhlIGVuZCBvZiB0aGUgZXhlcmNpc2UsIHlvdSB3aWxsIGNvbXBhcmUgdGhlIHNpbXVsYXRlZCAxOE8gY2VsbHVsb3NlIGZvciB0aGUgMyBzZWFzb25hbCB2YXJpYXRpb25zIG9mIFJIIChhbmQgdGVtcGVyYXR1cmUpIHdpdGggbWVhc3VyZW1lbnRzIG9mIGNlbGx1bG9zZSBkMThPIGluIHRyZWUgcmluZ3MgZnJvbSBhIHNpdGUgbG9jYXRlZCBpbiB0aGUgVVMgU291dGh3ZXN0LgoKIVtGaWd1cmUgMTogU2Vhc29uYWwgcmVsYXRpdmUgaHVtaWRpdHkgaW4gSEVMLUNhdGFsaW5hIE1vdW50YWlucyAoQXJpem9uYSkgKEJlbG1lY2hlcmkgZXQgYWwuIDIwMTggUENFKS4gTm90aWNlIHRoZSBsYXJnZSB2YXJpYXRpb25zIG9mIHJlbGF0aXZlIGh1bWlkaXR5Ll0oZmlndXJlcy9GSUdVUkUxX1JILnBuZykKCgoqIFlvdSB3aWxsIG5lZWQgdG8gZG93bmxvYWQgdGhlIFIgcHJvamVjdCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsc3plam5lci9ESVNDTy1Ob3RlYm9vazIuZ2l0IGFuZCBzZXQgeW91ciBvd24gd29ya2luZyBkaXJlY3RvcnkuIE9uY2UgeW91IG9wZW4gdGhlIGBgYE5vdGVib29rMi5ScHJvamBgYCBpbiBSIHN0dWRpbyB5b3UgY2FuIG9wZW4gdGhlIGBgYE5vdGVib29rMi5SbWRgYGAgZmlsZSB0byBwcm9jZWVkIHdpdGggdGhpcyBleGVyY2lzZS4KCiMjIFBBUlQgMTogU291cmNlIFdhdGVyCgpUaGUgZDE4TyBvZiBzb3VyY2Ugd2F0ZXIgbm90ZWQgIGFzIGBgYFNvdXJjZV8xOE9gYGAgaXMgdGhlIGlzb3RvcGljIHJhdGlvIG9mIHRoZSB3YXRlciB0cmFuc3BvcnRlZCB0aHJvdWdoIHRoZSB4eWxlbSB1cCB0byB0aGUgbGVhdmVzLiBUaGlzIHdhdGVyIGlzIGRlcml2ZWQgZnJvbSBkaXJlY3QgcHJlY2lwaXRhdGlvbiBhbmQgc29pbCB3YXRlciB0YWtlbiB1cCBieSB0aGUgcm9vdHMuIFRoaXMgcHJvY2VzcyBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgZDE4Ty4KVGh1cywgc291cmNlIHdhdGVyIGlzIHRoZSBzdGFydGluZyBwb2ludCBvZiBkMThPIHRoYXQgd2lsbCBiZSBtb2RpZmllZCBieSB0aGUgaXNvdG9waWMgZWZmZWN0cyAoZnJhY3Rpb25hdGlvbnMpIGR1cmluZyBhbGwgdGhlIHN0ZXBzIGxlYWRpbmcgdG8gaXRzIGZpeGF0aW9uIGluIHRyZWUgcmluZyBjZWxsdWxvc2UuIEhhdmluZyBhIHJvYnVzdCBlc3RpbWF0aW9uIG9yIG1lYXN1cmVtZW50IG9mIHNvdXJjZSB3YXRlciBkMThPIGlzIHRoZXJlZm9yZSBwYXJhbW91bnQuICAgIAoKSGVyZSwgdGhlIHNvdXJjZSB3YXRlciBpcyBzZXQgdXAgYXQgYSBmaXhlZCB2YWx1ZToKYGBge3J9ClNvdXJjZV8xOE8gPC0gLTggIyBUaGlzIGlzIHRoZSBpc290b3BpYyB2YWx1ZSBvZiB0aGUgc291cmNlIHdhdGVyIGFuZCAgd2lsbCByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsbCBkdXJpbmcgdGhpcyAgZXhlcmNpc2UKYGBgClRoZW4sIGl0IGlzIGNvbnZlcnRlZCB0byBhbiBpc290b3BpYyByYXRpbyB3aXRoIHJlZ2FyZCB0byB0aGUgc3RhbmRhcmQgVlNNT1c6ICAKYGBge3J9CnJzbW93IDwtIDAuMDAyMDA1MiAjIE94eWdlbiBJc290b3BlIHJhdGlvIG9mIHRoZSBTVEFOREFSRAlWU01PVwpSc291cmNlPSByc21vdyooMStTb3VyY2VfMThPLzEwMDApIApgYGAKCgojIyBQQVJUIDI6IGxlYWYgd2F0ZXIgaXNvdG9waWMgZW5yaWNobWVudCAgCgpEdXJpbmcgcGxhbnQgdHJhbnNwaXJhdGlvbiwgdGhlIGhlYXZpZXIgSDIxOE8gZXZhcG9yYXRlcyBhbmQgZGlmZnVzZXMgbW9yZSBzbG93bHkgdGhyb3VnaCB0aGUgc3RvbWF0YSB0aGFuIGRvZXMgSDIxNk8sIGxlYXZpbmcgbGVhZiB3YXRlciBlbnJpY2hlZCBpbiAxOE8uIEF0IHN0ZWFkeSBzdGF0ZSBhbmQgY29uc2lkZXJpbmcgdGhlIGxlYWYgYXMgYSBzaW5nbGUgYW5kIGlzb3RvcGljYWxseSB3ZWxsLW1peGVkIHdhdGVyIHBvb2wsIHRoZSBsZWFmIHdhdGVyIGlzb3RvcGljIGVucmljaG1lbnQgY2FuIGJlIGVzdGltYXRlZCB1c2luZyB0aGUgQ3JhaWcgR29yZG9uIG1vZGVsIGFzIGZvbGxvd3M6CgoKCi0gRGUgaXMgdGhlIGlzb3RvcGljIGVucmljaG1lbnQgb2YgZXZhcG9yYXRpdmUgc2l0ZSB3YXRlciAobGVhZikgYWJvdmUgdGhlIHNvdXJjZS4gIAotIEVwc2lsb25fcGx1cyBpcyB0aGUgZXF1aWxpYnJpdW0gZnJhY3Rpb25hdGlvbiBiZXR3ZWVuIGxpcXVpZCB3YXRlciBhbmQgdmFwb3IuICAKLSBFcHNpbG9uX2sgaXMgdGhlIGtpbmVjdGljIGZyYWN0aW9uYXRpb24gZm9yIGNvbWJpbmVkIGRpZmZ1c2lvbiB0aHJvdWdoIHN0b21hdGEgYW5kIHRoZSBib3VuZGFyeSBsYXllci4gIAotIER2IGlzIHRoZSBpc290b3BpYyBlbnJpY2htZW50IG9mIGF0bW9zcGhlcmljIHZhcG9yIGNvbXBhcmVkIHRvIHNvdXJjZSB3YXRlci4gIAotIHdhL3dpIGlzIHRoZSByYXRpbyBvZiB0aGUgd2F0ZXIgdmFwb3IgbW9sZSBmcmFjdGlvbiBpbiB0aGUgYWlyIHJlbGF0aXZlIHRvIHRoYXQgaW4gdGhlIGludGVyY2VsbHVsYXIgYWlyIHNwYWNlcy4gVGhpcyBpcyBhbHNvIHJlbGF0aXZlIGh1bWlkaXR5IGFzc3VtaW5nIGxlYWYgYW5kIGFpciB0ZW1wZXJhdHVyZSBhcmUgZXF1YWwuICAKCiMjIyBDbGltYXRlIFZhcmlhYmxlcy9JbnB1dHMKCmBgYHtyfQojIFRoZSAzIHRlbXBlcmF0dXJlICBhbmQgUmVsYXRpdmUgaHVtaWRpdHkgdmFsdWVzIG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gcmVmbGVjdCB0aGUgc2Vhc29uYWxpdHkgZGVzY3JpYmVkIGluIHRoZSBpbnRyb2R1Y3Rpb24KCnRlbXBlcmF0dXJlIDwtIGMoNDAsIDQwLCA0MCkgIyB0ZW1wZXJhdHVyZSBoZXJlIGlzIGluIENlbHNpdXMgClJlbGF0aXZlX2h1bWlkaXR5IDwtIGMoMTAwLCAxMDAsIDEwMCkgIyBSSCBpcyBpbiAlCgpgYGAKCiMjIyBDb25zdGFudHMKVGhlc2UgY29uc3RhbnRzIHdpbGwgYmUgdXNlZCB0byBlc3RpbWF0ZS9jYWxjdWxhdGUgdGhlIHZhcmlvdXMgbW9kZWwgcGFyYW1ldGVycywgc3BlY2lmaWNhbGx5CnRoZSB3YXRlciB2YXBvciBtb2xlIGZyYWN0aW9uIGluIHRoZSBhaXIgYW5kIGluIHRoZSBpbnRlcmNlbGx1bGFyIGFpciBzcGFjZXMuCmBgYHtyfQpiciA8LTEgIyBib3VuZGFyeSBsYXllciBjb25kdWN0YW5jZS4gKG1vbCBtLTIgcy0xKSwgY29uc2lkZXJlZCByZWFzb25hYmxlIHZhbHVlIGJldHdlZW4gMC4wMiB0byAzIGluIFJvZGVuIHBhcGVyIGJvdW5kYXJ5IGxheWVyIHJlc2lzdGFuY2UuCmFrIDwtIDEuMDI4NQkjIGFscGhhX2thcHBhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gCmFrYiA8LSAxLjAxODkJIyBhbHBoYV9rYXBwYV9iZXRhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gYm91bmRhcnkgbGF5ZXIKU3RvbWF0YWxfY29uZHVjdGFuY2UgPC0gMC41ICMgc3RvbWF0YWwgY29uZHVjdGFuY2UgdG8gd2F0ZXIgdmFwb3IKcHJlc3NfYmFyIDwtIDc3ICMgYmFyb21ldHJpYwlwcmVzc3VyZSAgKG1tYmFyKSAgCmBgYAoKIyMjIE1vZGVsIFBhcmFtZXRlcnMvVmFyaWFibGVzCiMjIyMgV2F0ZXIgVmFwb3IgKER2KQoKVGhlICBpc290b3BpYyB2YWx1ZSBvZiB0aGUgd2F0ZXIgdmFwb3IgaXMgZXN0aW1hdGVkIGJhc2VkIG9uIHNvdXJjZSB3YXRlciBkMThPIGFuZCBsZWFmIHRlbXBlcmF0dXJlLCBhc3N1bWluZyBlcXVpbGlicml1bSBiZXR3ZWVuIGF0bW9zcGhlcmljIHZhcG9yIGFuZCBzb3VyY2Ugd2F0ZXIuICBXYXRlciB2YXBvciBjYW4gYmUgZXN0aW1hdGVzIGFzIGZvbGxvd3M6ICAKCndhdGVyX3ZhcG9yID0gU291cmNlIHdhdGVyICsgdGhlIGVxdWlsaWJyaXVtIGZyYWN0aW9uYXRpb24gYmV0d2VlbiBsaXF1aWQgd2F0ZXIgYW5kIHZhcG9yLiAgCgpUaGUgZXF1aWxpYnJpdW0gZnJhY3Rpb25hdGlvbiB2YXJpZXMgYXMgYSBmdW5jdGlvbiBvZiB0ZW1wZXJhdHVyZS4gIAoKYGBge3J9CiMgdGhlIHRlbXBlcmF0dXJlIGluIHRoZSBlcXVhdGlvbiBiZWxvdyByZWZlcnMgdG8gdGhlIGxlYWYgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBDZWxzaXVzIGFuZCBpcyBjb252ZXJ0ZWQgdG8gS2VsdmluICgyNzMuMTUpCndhdGVyX3ZhcG9yIDwtU291cmNlXzE4TyArKC0xKigxLjEzNyooMTAwMDAwMC8oKHRlbXBlcmF0dXJlKzI3My4xNSleMikpLTAuNDE1NiooKDEwMDAvKHRlbXBlcmF0dXJlKzI3My4xNSkpLTIuMDY2NykpKSAKYGBgCgpUaGVuLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYW4gaXNvdG9waWMgcmF0aW8gd2l0aCByZWdhcmQgdG8gdGhlIHN0YW5kYXJkIFZTTU9XOiAgCmBgYHtyfQpSd2F0ZXJfdmFwb3I9IHJzbW93KigxK3dhdGVyX3ZhcG9yLzEwMDApCiNub3RlISAgSSBuZWVkIGhlbHAgb24gZmlndXJpbmcgb3V0IHRoaXMhIFdoYXQgaXMgbmVlZGVkPwpgYGAKCiMjIyMgQWxwaGEgKgpUaGUgZXF1aWxpYnJpdW0gZnJhY3Rpb25hdGlvbiBhdCBsZWFmIHRlbXBlcmF0dXJlICBpcyB0ZW1wZXJhdHVyZSBkZXBlbmRlbnQgKHNlZSBNYWpvdWJlLCAxOTcxLCBKLiBDaGltLiBQaHlzLiA1ODoxNDIzLTE0MzYpICAKCmBgYHtyfQphbHBoYV9zdGFyID1leHAoKDEuMTM3KjEwMDAvKDI3My4xNSt0ZW1wZXJhdHVyZSleMiktKDAuNDE1Ni8oMjczLjE1K3RlbXBlcmF0dXJlKSktMC4wMDIwNjY3KQpgYGAKCiMjIyMgV2F0ZXIgdmFwb3IgbW9sZSBmcmFjdGlvbiBpbiB0aGUgaW50ZXJjZWxsdWxhciBhaXIgc3BhY2VzCkhlcmUgd2UgYXNzdW1lIHRoYXQgdGhlIHZhcG9yIGlzIHNhdHVyYXRlZCBpbnNpZGUgdGhlIGxlYWYuIFdlIGFwcGx5IHRoaXMgZm9ybXVsYSB0byBjYWxjdWxhdGUgdGhlIHZhcG9yIHByZXNzdXJlIHdoZW4gc2F0dXJhdGVkIChSaD0xMDAlKSBhdCB0aGUgdGVtcGVyYXR1cmUgd2UgYmVzdCBlc3RpbWF0ZSB0aGUgcGxhbnQgaXMgYW5kIGNhbGwgaXQgYGBgImVpImBgYC4KYGBge3J9CmVpIDwtICgxMDEzMjUqZXhwKCgoKC0wLjEyOTkqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSktMC42NDQ1KSooMS0oMzczLjE2LygyNzMuMTUgKyB0ZW1wZXJhdHVyZSkpKS0xLjk3NikqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSkrMTMuMzE4NSkqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSkpKS8xMDAwCmBgYAoKVGhlbiBsZWFmIHdhdGVyIHZhcG9yIGlzIGNvbnZlcnRlZCB0byBtb2xlIGZyYWN0aW9uIGFzIGZvbGxvd3M6CmBgYHtyfQp3aT1laS9wcmVzc19iYXIKYGBgCgojIyMjIFdhdGVyIHZhcG9yIG1vbGUgZnJhY3Rpb24gaW4gdGhlIGFpcgpgYGB7cn0KZWEgPC0gKFJlbGF0aXZlX2h1bWlkaXR5LzEwMCkqZWkKYGBgCgpUaGVuIHdhdGVyIHZhcG9yIGluIHRoZSBhaXIgaXMgY29udmVydGVkIHRvIG1vbGUgZnJhY3Rpb24gYXMgZm9sbG93czoKYGBge3J9CndhPSBlYS9wcmVzc19iYXIKYGBgCgojIyMjIFRvdGFsIENvbmR1Y3RhbmNlCmBgYCB7cn0KZyA9IDEvKDEvU3RvbWF0YWxfY29uZHVjdGFuY2UgKyAxL2JyKSAjIG9yIDEvKHJzK3JiKSAgaW4gbW9sCmBgYAoKIyMjIyBMZWFmIHRyYW5zcGlyYXRpb24gClRyYW5zcGlyYXRpb24gd2lsbCBkZXBlbmQgb24gd2F0ZXIgdmFwb3IgbW9sZSBmcmFjdGlvbiBpbiB0aGUgYWlyLCBpbiB0aGUgbGVhZiBhbmQgb24gdG90YWwgY29uZHVjdGFuY2UgYXMgZm9sbG93czoKYGBgIHtyfQpFIDwtICh3aS13YSkqZyAjKG1vbCBtLTIgcy0xKSAjIGJhcmJvdXIgMjAwNApgYGAKCiMjIyMgTGVhZiBzdXJmYWNlIHdhdGVyIHZhcG9yCmBgYCB7cn0Kd3MgPC0gKChTdG9tYXRhbF9jb25kdWN0YW5jZSp3aSktRSooMS13aS8yKSkvKFN0b21hdGFsX2NvbmR1Y3RhbmNlIC0gRS8yKSAjbW9sZSBmcmFjdGlvbiBSb2RlbiAoMjAwMCksIEJhbGwgKDE5ODcpLgpgYGAKCiMjIyMgVmFwb3IgcHJlc3N1cmUgYXQgbGVhZiBzdXJmYWNlIApgYGAge3J9CmVzbCA8LSB3cypwcmVzc19iYXIgIyhrUGEpIGhpZ2hlciBwcmVzc3VyZSAgdGhhbiB0aGUgYXRtb3NwaGVyZQpgYGAKCiMjIyBFc3RpbWF0aW5nIExlYWYgd2F0ZXIgaXNvdG9waWMgZW5yaWNobWVudAoKTGV0cyByZWNhbGwgdGhlIGVzdGltYXRlZCB2YXJpYWJsZXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSBsZWFmIHdhdGVyCgpgYGAgUnNvdXJjZSBgYGAgIFNvdXJjZSB3YXRlciAgCmBgYFJ3YXRlcl92YXBvcmBgYCBpc290b3BpYyB2YWx1ZSBvZiB0aGUgd2F0ZXIgdmFwb3IgICAgIApgYGBlaWBgYCBXYXRlciB2YXBvciBwcmVzc3VyZSBpbnNpZGUgdGhlIGxlYWYgICAgCmBgYGVhYGBgICBXYXRlciB2YXBvciBwcmVzc3VyZSBvZiB0aGUgYWlyICAKYGBgZXNsYGBgIFdhdGVyIHZhcG9yIHByZXNzdXJlIGF0IGxlYWYgc3VyZmFjZSAgCgoKVGhlIHZhbHVlcyBjYW4gYmUgcm91bmRlZCBhcyBmb2xsb3dzOgpgYGAge3J9CnJvdW5kIChSc291cmNlLCBkaWdpdHMgPSA0KQpyb3VuZChSd2F0ZXJfdmFwb3IsIGRpZ2l0cyA9IDQpCnJvdW5kKGVzbCwgZGlnaXRzID0gMikKcm91bmQoZWEsIGRpZ2l0cz0yKQpyb3VuZChlaSwgZGlnaXRzPTIpCmBgYAoKVGhlIGxlYWYgd2F0ZXIgZW5yaWNobWVudCBjYW4gYmUgZXN0aW1hdGVkIGFzIGZvbGxvd3M6CmBgYCB7cn0KUmxlYWYgPC0gYWxwaGFfc3RhciooKGFrKlJzb3VyY2UgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVpLWVzbCkvZWkpKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWtiKlJzb3VyY2UgKihlc2wtZWEpL2VpKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUndhdGVyX3ZhcG9yKmVhL2VpKSkKYGBgIAoKVGhlIGxlYWYgd2F0ZXIgZW5yaWNobWVudCBpcyBlc3RpbWF0ZWQgaW4gdGVybXMgb2YgaXNvdG9waWMgcmF0aW8gKFIpLiBJdCBzaG91bGQgYmUgY29udmVydGVkICB0byBwZXJtaWxsIHZhbHVlcyBhcyBmb2xsb3dzOgoKYGBgIHtyfQpyc21vdyA8LSAwLjAwMjAwNTIKbGVhZl93YXRlcl8xOE8gPC0gKChSbGVhZi9yc21vdyktMSkqMTAwMApyb3VuZChsZWFmX3dhdGVyXzE4TywgZGlnaXRzID0gMikKYGBgCgoKCgojIyBQQVJUIDM6IGlzb3RvcGljIHNpZ25hbCBpbiB0aGUgQ2VsbHVsb3NlICAKCklzb3RvcGljIGZyYWN0aW9uYXRpb24gZHVyaW5nIHN1Z2FyIHN5bnRoZXNpcyBhbmQgbWl4aW5nIGR1cmluZyBjZWxsdWxvc2Ugc3ludGhlc2lzLiAKCk5vdywgYWZ0ZXIgd2Uga25vdyB0aGUgd2F0ZXIgd2hlcmUgdGhlIHN1Z2FycyBhcmUgbWFkZSBhbmQgdHJhbnNwb3J0ZWQgaW4gdGhlIHBobG9lbSwgd2UgY2FuIHVzZSB0aGUgbGVhZiB3YXRlciBhbmQgdGhlIFNvdXJjZV8xOE8gdG8gZXN0aW1hdGUgdGhlIHJlc3VsdCBvbiB0aGUgY2VsbHVsb3NlLCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGF0IGR1cmluZyBjZWxsdWxvc2Ugc3ludGhlc2lzLCB0aGUgc291cmNlIHdhdGVyIHdpbGwgaGF2ZSBzb21lIGluZmx1ZW5jZSBvbiB0aGUgcmVzdWx0LCBhbmQgd2UgdXN1YWxseSB1c2UgYSA0MiBwZXJjZW50IGV4Y2hhbmdlLgoKCmBgYHtyfQojIE5vdyAgIGFmdGVyIHdlIGtub3cgdGhlICB3YXRlciB3aGVyZSB0aGUgc3VnYXJzIGFyZSBtYWRlIGFuZCB0cmFzcG9ydGVkIGluIHRoZSBmbG9lbSAgd2UgY2FuIHVzZSB0aGUgbGVhZiB3YXRlciBhbmQgdGhlIFNvdXJjZV8xOE8gdG8gZXN0aW1hdGUgdGhlIGVuZCByZXN1bHQgb24gdGhlIGNlbGx1bG9zZSwgdGFrZSBpbiBjb25zaWRlcmF0aW9uIHRoYXQgZHVyaW5nICBjZWxsdWxvc2Ugc2ludGhlc2lzaSAgdGhlIHNvdXJjZSB3YXRlciB3aWxsIGhhdmUgc29tZSBpbmZsdWVuY2Ugb24gdGhlIGVuZCByZXN1bHQuIGFuZCB3ZSB1c3VhbHkgdXNlIGEgNDIgcGVyY2VudCBleGNoYW5nZQojIGFuZCBzb21lIGNvbnN0YW50cwoKZXBzaWxvbl9zIDwtICAyNyAjQXV0b3Ryb3BoaWMgZnJhY3Rpb25hdGlvbiBTdWNyb3NlCQplcHNpbG9uX2MgPC0gMjcJIyBBdXRvdHJvcGhpYyBmcmFjdGlvbmF0aW9uIENlbGx1bG9zZSAjIyAwLjAwODQqVG1pbi50c14yLTAuNTEqVG1pbi50cysgMzMuMTcyIApGXzAgPC0gMC40MiAjIHByb3BvcnRpb24gb2Ygc291cmNlIHdhdGVyIHVzZWQgZHVyaW5nIGNlbGx1bG9zZSBzaW50aGVzeXMKCmNlbGx1bG9zZV9kMThPPSBGXzAqKFNvdXJjZV8xOE8gKyBlcHNpbG9uX2MpICsgKDEgLSBGXzApICogKGxlYWZfd2F0ZXJfMThPKyBlcHNpbG9uX3MpIAoKYGBgCgojIyBQQVJUIDQ6IENvbXBhcmlzb24gYmV0d2VlbiBtb2RlbGVkIGRhdGEgYW5kIG9ic2VydmF0aW9ucwoKIVtNZWNoYW5pc3RpYyBtb2RlbGluZyBvZiB0cmVl4oCQcmluZyBjZWxsdWxvc2UgzrQxOE8gYW5kIGxlYWYgd2F0ZXIgZW5yaWNobWVudCDOlEwsIGFuZCB0aGVpciBzZW5zaXRpdml0aWVzIHRvIHJlbGF0aXZlIGh1bWlkaXR5LiAoYSkgVGhlIENyYWln4oCTR29yZG9uIG1vZGVsIChDRykgb3V0cHV0cyBhcmUgcGxvdHRlZCBmcm9tIE1heSB0byBEZWNlbWJlciwgdGhlIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIGNlbGwgd2FsbCB0aGlja2VuaW5nIGZvciBhbGwgdHJlZeKAkHJpbmcgc3ViZGl2aXNpb25zLiBUaGUgeWVsbG93IGNvbG9yIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhlIENHIHNpbXVsYXRpb25zIG9mIM60MThPIGNlbGx1bG9zZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBwcm9wb3J0aW9uIG9mIGV4Y2hhbmdlYWJsZSBveHlnZW4gaW4gY2VsbHVsb3NlIChQZXgpIHZhcmlhYmlsaXR5IGZyb20gMC4xICh0aGluIGxpbmUpIHRvIDAuNyAodGhpY2sgbGluZSkuIFRoZSBncmF5IGhvcml6b250YWwgYmFycyBjb3JyZXNwb25kIHRvIHRoZSBjZWxsIHdhbGwgdGhpY2tlbmluZyAob3IgY2VsbOKAkG1hdHVyYXRpb24pIHBlcmlvZCBmb3IgZWFjaCBzdWJkaXZpc2lvbiBhbmQgYXJlIHBsb3R0ZWQgb24gdGhlIG1lYW4gb2YgdGhlIM60MThPIG1lYXN1cmVtZW50cy4gVGhlIGNlbGwgd2FsbCB0aGlja2VuaW5nIHBoYXNlIHdhcyBkZXJpdmVkIGZyb20gbWljcm9zY29waWMgcGhlbm9sb2dpY2FsIG9ic2VydmF0aW9ucyBmcm9tIE1vcmlubyBhbmQgSHVnaGVzIChVbml2ZXJzaXR5IG9mIEFyaXpvbmEsIHVucHVibGlzaGVkIG9ic2VydmF0aW9ucywgVGFibGUgUzMpLiBUaGUgY2xpbWF0ZSBkcml2ZXJzIHVzZWQgaW4gdGhlIENHIG1vZGVsIHRvIG1ha2UgzrQxOE9jZWwgcHJlZGljdGlvbnMgd2VyZSBkZXJpdmVkIGZyb20gUFJJU00gZGF0YTsgKGIpIHNlYXNvbmFsIGN5Y2xlIG9mIHRoZSBDRyBtZWFuIGxlYWYgd2F0ZXIgZW5yaWNobWVudCAozpRMKS4gVGhlIHNoYWRlZCBncmF5IGNvbG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgbW9kZWxsZWQgzpRMLiBUaGUgZGFzaGVkIGJsdWUgbGluZSBpbiAoYSkgYW5kIChiKSBpbmRpY2F0ZXMgdGhlIGF2ZXJhZ2UgZGF0ZSBvZiB0aGUgbW9uc29vbiBvbnNldDsgKGMpIG1vZGVsbGVkIM6UTCBwbG90dGVkIHZlcnN1cyByZWxhdGl2ZSBodW1pZGl0eSAoUkgpIGluICUgY2FsY3VsYXRlZCBhdCBiaW1vbnRobHkgcmVzb2x1dGlvbi4gVGhlIM6UTCBzaW11bGF0aW9ucyB3ZXJlIHJ1biB1c2luZyBtZWFuLCBtaW5pbXVtLCBhbmQgbWF4aW11bSBSSC4gVGhlIHJhbmdlIG9mIFJIIGZvciB0aGUgaHlwZXLigJBhcmlkIHBlcmlvZCBvZiBNYXkgYW5kIEp1bmUgYXJlIHBsb3R0ZWQgaW4gb3JhbmdlIGNpcmNsZXMuIFRoZSBkYXJrIGJsdWUgY2lyY2xlcyByZXByZXNlbnQgUkggcmFuZ2Ugb2JzZXJ2ZWQgZm9yIHRoZSBtb25zb29uIHNlYXNvbiAoSnVseeKAk0F1Z3VzdCkuIFRoZSBncmF5IGNpcmNsZXMgY29ycmVzcG9uZCB0byB0aGUgcmFuZ2Ugb2YgUkggb2JzZXJ2ZWQgZnJvbSBTZXB0ZW1iZXIgdG8gQXByaWwgKEJlbG1lY2hlcmkgZXQgYWwuIDIwMTggUENFKV0oZmlndXJlcy9GSUdVUkU2LnBuZykKCnlvdXIgZXN0aW1hdGlvbnMgZm9yIHRoZSBjYWxsdWxvc2Ugb3h5Z2VuIElzb3RvcGVzIGFyZToKYGBge3J9CnJvdW5kKGNlbGx1bG9zZV9kMThPLCBkaWdpdHMgPSAyKQpgYGAKeW91ciBlc3RpbWF0aW9ucyBmb3IgdGhlIGxlYWYgd2F0ZXIgb3h5Z2VuIElzb3RvcGVzIGFyZToKYGBge3J9CnJvdW5kKGxlYWZfd2F0ZXJfMThPLCBkaWdpdHMgPSAyKQpgYGAKCiMjIyAgQ29tcGFyaXNvbiBiZXR3ZWVuIG1vZGVsZWQgZGF0YSBhbmQgb2JzZXJ2YXRpb25zLCAKTm93IHdpdGggdGhlc2UgdmFsdWVzIHRoYXQgeW91IGNvbWFyZWQgIHdyaXRlIGRvd24geW91ciBvYnNlcnZhdGlvbnMgZGlmZmVyZW5jZXMgYW5kICBzaW1pbGFyaXRpZXMgYmV0d2VlbiAgdGhlIG1vZGVsZWQgZGF0YSBpbiB0aGlzIGV4Y2Vyc2lzZSBhbmQgdGhlIG1lYXN1cmVtZW50cyBzaG93biBpbiB0aGUgZmlndXJlIDIgYWJvdmUuICAKCkhvdyBkbyB5b3UgdGhpbmsgdGhpcyB0b29sIGlzIHVzZWZ1bD8KCldoYXQgYXJlIHRoZSBjb25zdHJhaW5zIG9yIGRpZmZpY3VsdGllcyBvbiBpbXBsZW1lbnRpbmcgdGhpcyBtb2RlbCBmb3IgcmVsaWFibGUgYW5hbHlzaXM/CgoKCgoKCgoKIyBWUEQgaW4gKGtQYSkKdnBkID1laS1lYV92IApyb3VuZCh2cGQsIGRpZ2l0cz00ICkKCgoKCgo=